package ludoxia.classe
{
	import fl.core.UIComponent;
	
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.utils.getTimer;
	
	import mx.controls.Image;
	import mx.utils.object_proxy;

	public class terrain
	{
		/* Graphique */
		[Embed (source="background.jpeg")]
		public const TERRAIN_BMP : Class;
		public const TERRAIN_DATA : BitmapData = (new TERRAIN_BMP() as Bitmap).bitmapData;		
		private const TERRAIN_WIDTH : int = TERRAIN_DATA.rect.width;
		private var TERRAIN_SPEED : int;
		private const SENS_DEFILEMENT : int = -1;
		public static const yOrigine : int = 380;
		public var conteneur:Image; //UIMovieClip
		public var Sprite1Terrain : Sprite;
		public var Sprite2Terrain : Sprite; //copie de Sprite1
		public var LeJoueur : joueur;
		
		private var LastEmplacement: Number;
		private var CurrentEmplacement: Number;
		
		private var terrain1First : Boolean;
		
		private var deltaTime : Number;
		private var lastTime : Number;
		
		/* Ce qu'il y a derrière */
		private var tabTerrain:Array;
		public static var largeur:int = 30;
		public static var hauteur:int = 5;
		public static const correspondancePixel:int = 40;
		private var objets:listeObjet;
		private var randPlacerPiege:Array;
		
		private var objetsTerrain:Array;
		
		public function terrain()
		{
			initTab();
			randPlacerPiege = new Array();
			objetsTerrain = new Array();
			objets = new listeObjet();
			
			TERRAIN_SPEED  = -300;
			
			randPlacerPiege[0] = true;
			randPlacerPiege[1] = false;
			
			Sprite1Terrain = new Sprite();
			Sprite1Terrain.graphics.beginBitmapFill(TERRAIN_DATA, null, false, false);
			Sprite1Terrain.graphics.drawRect(0, 0, TERRAIN_WIDTH, TERRAIN_DATA.rect.height);
			Sprite1Terrain.graphics.endFill();
			
			Sprite2Terrain = new Sprite();
			Sprite2Terrain.graphics.beginBitmapFill(TERRAIN_DATA, null, false, false);
			Sprite2Terrain.graphics.drawRect(0, 0, TERRAIN_WIDTH, TERRAIN_DATA.rect.height);
			Sprite2Terrain.graphics.endFill();
			
			Sprite1Terrain.x = -TERRAIN_WIDTH;
			Sprite2Terrain.x = 0;
			terrain1First = true;
			
			deltaTime = 0.0;
			lastTime = getTimer();
			
			LastEmplacement = 0;
			CurrentEmplacement = 0;
			
		}
		
		private function initTab():void
		{
			
			tabTerrain = new Array(largeur);
			for (var i:uint=0;i < largeur; i++){
				tabTerrain[i] = new Array(hauteur);
				for (var j:uint=0;j < hauteur; j++)
					tabTerrain[i][j] = null;
			}
		}
		
		public function placerObstacle(nbrPiegeAPlacer:uint,emplacementX:uint):void{
			var varRandomPlus:RandomPlus = new RandomPlus(hauteur - 1,0);
			var varEmplacementY:Number;
			var copieObjet:obstacle;
			var Pointeur:obstacle;
			
			for (var i:uint=1;i <= nbrPiegeAPlacer;++i)
			{

				varEmplacementY = varRandomPlus.getNum();
				Pointeur = objets.getObstacle();
				if (Pointeur != null)
				{
					//tabTerrain[emplacementX][varEmplacementY] = Pointeur;
					
					if (Pointeur.SpriteObjet != null){
						
						copieObjet = new obstacle(Pointeur.Nom);
						tabTerrain[emplacementX][varEmplacementY] = copieObjet;
						copieObjet.SpriteObjet.x = -1*correspondancePixel;
						copieObjet.SpriteObjet.y = varEmplacementY*correspondancePixel + terrain.yOrigine + correspondancePixel;
						
						conteneur.addChild(copieObjet.SpriteObjet);
						objetsTerrain.push(copieObjet.SpriteObjet);
					}
				}
			}
		}
		
		public function placerBonus(nbrBonusAPlacer:uint,emplacementX:uint):void{
			var varRandomPlus:RandomPlus = new RandomPlus(hauteur - 1,0);
			var varEmplacementY:Number;
			var copieObjet:bonus;
			var Pointeur:bonus;
			
			for (var i:uint=1;i <= nbrBonusAPlacer;i++)
			{
				varEmplacementY = varRandomPlus.getNum();
				Pointeur = objets.getBonus();
				if (Pointeur != null)
				{
//					tabTerrain[emplacementX][varEmplacementY] = Pointeur;
					
					if (Pointeur.SpriteObjet != null){
						
						copieObjet = new bonus(100,Pointeur.Nom);
						tabTerrain[emplacementX][varEmplacementY] = copieObjet;
						copieObjet.SpriteObjet.x = -1*correspondancePixel;
						copieObjet.SpriteObjet.y = varEmplacementY*correspondancePixel + terrain.yOrigine + correspondancePixel;
						
						conteneur.addChild(copieObjet.SpriteObjet);
						objetsTerrain.push(copieObjet.SpriteObjet);
					}
				}
			}
		}
		
		//Servira à effacer les objets après le passage de la voiture
		public function effacerObjets(emplacementX:uint):void{
			var borneMin:Number = 0;
			var borneMax:Number = randPlacerPiege.length - 1;
			var aleatoireNumber:Number = Math.round(Math.random() * (borneMax - borneMin)) + borneMin;
			
			for (var i:uint=0;i < hauteur;i++)
			{
				//effacement des objets derrières le joueur
				if (tabTerrain[emplacementX][i] != null){
					conteneur.removeChild(objet(tabTerrain[emplacementX][i]).SpriteObjet);
					tabTerrain[emplacementX][i] = null;
				}
			}
			
			if (randPlacerPiege[aleatoireNumber]){
				placerObstacle(1,emplacementX);
				placerBonus(1,emplacementX);
			}
		}
		
		/* Fonction pour le scrolling*/
		public function gameLoop(event : Event) : void {
			deltaTime = getTimer() - lastTime;
			lastTime += deltaTime;
			step(deltaTime / 1000.0);
		}
		
		private function step(deltaTime:Number):void {
			
			var vitesseDefilement:Number = SENS_DEFILEMENT*TERRAIN_SPEED*LeJoueur.Vitesse* deltaTime;
			CurrentEmplacement += vitesseDefilement;
			
			for each (var sprite:UIComponent in objetsTerrain){
				sprite.x += vitesseDefilement;
			}
			
			if(terrain1First) {
				
				Sprite1Terrain.x += vitesseDefilement;
				Sprite2Terrain.x = Sprite1Terrain.x + TERRAIN_WIDTH;
				if(Sprite1Terrain.x >= 0) {
					Sprite2Terrain.x = Sprite1Terrain.x - TERRAIN_WIDTH;
					terrain1First = false;
				}
			}
			else {
				Sprite2Terrain.x += vitesseDefilement;
				Sprite1Terrain.x = Sprite2Terrain.x + TERRAIN_WIDTH;
				if(Sprite2Terrain.x >= 0) {
					Sprite1Terrain.x = Sprite2Terrain.x - TERRAIN_WIDTH;
					terrain1First = true;
				}
			}
			
			if (CurrentEmplacement >= (LastEmplacement + correspondancePixel))
			{
				LeJoueur.Avancer();
				LastEmplacement += correspondancePixel;
				if(LeJoueur.PositionX == 0)
					effacerObjets(largeur - 1);
				/*else if(LeJoueur.PositionX == 1)
					effacerObjets(largeur - 2);
				else if(LeJoueur.PositionX == 2)
					effacerObjets(largeur - 1);*/
				else 
					effacerObjets(LeJoueur.PositionX - 1);
				if (tabTerrain[LeJoueur.PositionX][LeJoueur.PositionY] != null)
				{
					var objetRencontre:IObjetInteractive;
					objetRencontre = IObjetInteractive(tabTerrain[LeJoueur.PositionX][LeJoueur.PositionY]);
					objetRencontre.actionSurJoueur(LeJoueur);
				}
			}
			
		}
	}
}